MENTAL, UN LENGUAJE
DE INTELIGENCIA
ARTIFICIAL

Más allá de Lisp y Prolog

“Lisp es el mejor lenguaje de programación jamás diseñado” (Alan Key)

“John McCarthy hizo por la programación algo parecido a lo que Euclides hizo por la geometría” (Paul Graham)



Las Lenguajes de Inteligencia Artificial

En Inteligencia Artificial (IA) ha habido una larga polémica sobre cual era el lenguaje más adecuado para desarrollar aplicaciones, sobre todo sistemas expertos. El debate se centró básicamente entre “Lispistas” y “Prologistas”, es decir, los seguidores o partidarios de los lenguajes Lisp y Prolog, respectivamente.
El Lenguaje Lisp

In 1960, John McCarthy publicó un notable artículo [McCarthy, 1960] en el que axiomatizó la programación. Era un ejercicio teórico, un intento de crear una alternativa más elegante a la máquina de Turing. Demostró que era posible construir un lenguaje de programación a partir de un conjunto de funciones simples. Denominó a este lenguaje “Lisp”, por “List Processing” porque el lenguaje usaba solo una estructura de datos para almacenar datos y código: la lista. Lisp es el segundo lenguaje de programación más antiguo que existe (después del Fortran). Es considerado el lenguaje de alto nivel más flexible que existe [Wiston, 1984].

Lisp incorporaba 9 nuevas ideas:
  1. Condicionales.
    Un condicional es una estructura “if-then-else”. Hoy día lo vemos natural, pero en su día el Fortran (el lenguaje de aquella época) tenía solo un “goto” condicional. Esta estructura se difundió rápidamente en otros lenguajes.

  2. El tipo función.
    Las funciones en Lisp son los objetos principales. Son un tipo de datos, como los enteros, las cadenas de caracteres (strings), etc. Al representarse en listas, se pueden almacenar en variables, modificarlas, pasarlas como argumentos, etc.

  3. Recursion.
    La recursión existía como concepto matemático antes de la aparición de Lisp, pero Lisp fue el primer lenguaje de programación en implementarlo.

  4. Un nuevo concepto de variables.
    En Lisp, todas las variables son punteros (direcciones). Los valores tienen tipos, pero no las variables. Asignar o ligar variables significa copiar punteros, no el contenido al que apuntan.

  5. Recogida de basura (garbage collection).
    Es un mecanismo de gestión de la memoria de trabajo: para reserva, liberación y compactación de espacios de memoria.

  6. Los programas se componen de expresiones simbólicas (S-expresions).
    Los programas Lisp son árboles de expresiones, cada una de las cuales retorna un valor (o varios valores). Esto contrastaba con otros lenguajes que distinguían entre expresiones y sentencias, y donde no se podían anidar sentencias. Esta limitación desapareció más tarde con la aparición de los lenguajes estructurados.

  7. El lenguaje completo está siempre disponible.
    No hay distinción entre tiempo real, tiempo de compilación y tiempo de ejecución. Se puede compilar o ejecutar mientras se lee, leer o ejecutar mientras se compila, y leer o compilar en tiempo de ejecución.

    La ejecución de código en tiempo de lectura permite a los usuarios de Lisp modificar la sintaxis de Lisp. Ejecutar código en tiempo de compilación es la base de las macros. Compilar en tiempo de ejecución es la base del uso de Lisp como un lenguaje de extensión en programas como Emacs. Leer en tiempo de ejecución permite a los programas comunicar mediante expresiones simbólicas (S-expresions), una idea reinventada como XML.
Cuando Lisp nació, se presentó como un liberador de ciertas restricciones de los lenguajes convencionales, ofreciendo aspectos inéditos, incluyendo mecanismos genéricos:
Crítica

Se nota que la concepción básica de Lisp tuvo lugar hace más de 50 años. Hay toda una serie de inconvenientes, desventajas e inconsistencias. Algunas de ellas son:
El Lenguaje Prolog

Prolog (Programming in Logic) es un lenguaje de programación declarativa mediante reglas lógicas.

Utiliza el llamado “principio de resolución”, un principio propuesto en 1965 por John Alan Robinson, que utiliza una regla de inferencia que permite deducir nuevas relaciones a partir de una base de conocimientos formada por hechos y reglas. Permite, por ejemplo, demostrar un teorema de manera automática. Este principio fue el fundamento de la programación lógica.

Prolog fue creado en 1970 por Robert Kovalsky (la teoría), Maarten van Emdem (el modelo experimental), ambos de la Universidad de Edimburgo, y Alain Colmerauer (la implementación), de la Universidad de Marsella. La sintaxis propuesta por Kowalsky se considera el estándar de facto de la programación lógica. Lenguaje declarativo quiere decir que declaramos todo lo que sabemos: los hechos y las reglas, que forman la base de conocimientos.

En los años 1980s tuvo una gran difusión por todo el mundo, especialmente cuando los japoneses decidieron utilizarlo para el desarrollo de los ordenadores de quinta generación.

Micro-Prolog es una versión de Prolog para ordenadores personales y popularizado en los años 1980s. Es un Prolog simplificado que se basa en listas, como Lisp,

Existen versiones de Prolog programadas en Lisp. En [Boizumault, 1993] aparece el código fuente Lisp de un intérprete de Micro-Prolog II. El libro de Peter Norvig [1991] dedica un tercio del libro a cómo implementar Prolog en Lisp.


MENTAL, Más Allá de Lisp y Prolog

MENTAL es un lenguaje que integra las características esenciales de Lisp y Prolog. A pesar de su pequeño tamaño, MENTAL es enormemente más potente que Lisp y Prolog juntos, precisamente porque se basa en arquetipos primarios. Va más allá de la programación imperativa y declarativa. Y es enormemente más sencillo, genérico y con más posibilidades. Permite especificar bases de conocimientos tipo Prolog (basadas en hechos y reglas), pero también permite establecer relaciones de todo tipo.

MENTAL se basa en axiomas semánticos universales. Es la verdadera y completa axiomatización de la realidad interna y externa.
Algunas funciones de Lisp en MENTAL

Bibliografía